"""
签名验证模块
"""

import json
import time

from jlpay.exception.exceptions import SignVerifyException
from jlpay.utils.sm_utils import sm2_sign, sm2_verify, generate_random_string


class SignVerifier:
    """签名验证类"""
    
    def __init__(self, config):
        """
        初始化签名验证类
        
        Args:
            config: OrgConfig实例
        """
        self.config = config
    
    def sign(self, method, uri, body):
        """
        生成请求签名
        
        Args:
            method: HTTP请求方法
            uri: 请求URI
            body: 请求体
            
        Returns:
            签名信息元组 (签名值, 时间戳, 随机字符串)
        """
        # 生成时间戳和随机字符串
        time_stamp = str(int(time.time()))
        random_string = generate_random_string(32)
        
        # 构建签名内容
        body_str = json.dumps(body, ensure_ascii=False) if isinstance(body, dict) else str(body)
        sign_body = f'{method}\n{uri}\n{time_stamp}\n{random_string}\n{body_str}\n'
        
        # 进行签名
        sign_value = sm2_sign(sign_body, self.config.org_pri_key_hex, self.config.org_pub_key_hex)
        
        return sign_value, time_stamp, random_string
    
    def verify(self, method, uri, timestamp, nonce, body, signature):
        """
        验证响应签名
        
        Args:
            method: HTTP请求方法
            uri: 请求URI
            timestamp: 时间戳
            nonce: 随机字符串
            body: 响应体
            signature: 签名值
            
        Returns:
            验证结果，True或False
            
        Raises:
            SignVerifyException: 验签失败时抛出
        """
        # 构建签名内容
        sign_body = f'{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n'
        
        # 验证签名
        verify_result = sm2_verify(sign_body, signature, self.config.jlpay_pub_key_hex)
        
        if not verify_result:
            raise SignVerifyException("响应签名验证失败")
        
        return True


class SignVerifierManager:
    """签名管理器"""
    
    @staticmethod
    def get_verifier(config):
        """
        获取签名验证器
        
        Args:
            config: OrgConfig实例
            
        Returns:
            SignVerifier实例
        """
        return SignVerifier(config) 